﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace NetJsWire.Design
{
    internal class ControlDataObject : IDataObject
    {
        private object _data = null;
        private string _format = null;

        public ControlDataObject()
        {
            _data = null;
            _format = null;
        }

        public ControlDataObject( Control control )
        {
            SetData( control );
        }

        public ControlDataObject( Control[] controls )
        {
            SetData( controls );
        }

        public object GetData( Type format )
        {
            return this.GetData( format.ToString() );
        }

        public object GetData( string format )
        {
            return this.GetData( format, true );
        }

        public object GetData( string format, bool autoConvert )
        {
            if ( format == _format )
            {
                return _data;
            }
            return null;
        }

        public bool GetDataPresent( Type format )
        {
            return this.GetDataPresent( format.ToString() );
        }

        public bool GetDataPresent( string format )
        {
            return this.GetDataPresent( format, true );
        }

        public bool GetDataPresent( string format, bool autoConvert )
        {
            if ( format == _format )
            {
                return true;
            }
            return false;
        }

        public string[] GetFormats()
        {
            return this.GetFormats( true );
        }

        public string[] GetFormats( bool autoConvert )
        {
            string[] formats = new string[ 2 ];
            formats[ 0 ] = typeof( Control ).ToString();
            formats[ 1 ] = typeof( Control[] ).ToString();
            return formats;
        }

        public void SetData( object data )
        {
            if ( data is Control )
                this.SetData( typeof( Control ), data );
            else if ( data is Control[] )
                this.SetData( typeof( Control[] ), data );
        }

        public void SetData( Type format, object data )
        {
            this.SetData( format.ToString(), data );
        }

        public void SetData( string format, object data )
        {
            this.SetData( format, true, data );
        }

        public void SetData( string format, bool autoConvert, object data )
        {
            if ( ValidateFormat( format ) )
            {
                _data = data;
                _format = format;
            }
        }

        private bool ValidateFormat( string format )
        {
            bool valid = false;

            string[] formats = GetFormats();
            foreach ( string f in formats )
            {
                if ( f == format )
                {
                    valid = true;
                    break;
                }
            }

            return valid;
        }
    }
}
